#include "../headers/glossaire.h"
#include "../headers/debug.h"
#include "../headers/main.h"
#include "../headers/outils.h"


void debug_min_print_jeu(char* jeu) {
    //Affiche toutes les cartes du jeu
    //Version min
    int i = 0;
    for (i = 0; jeu[i] != '\0'; i++) {
        if (i > 0) { printf(" / "); }
        printf("%s de %s", getNomValeur(jeu[i]), getNomCouleur(jeu[i]));
        
    }
}

void debug_print_jeu(char* jeu) {
    //Affiche toutes les cartes du jeu
    int i = 0;
    for (i = 0; jeu[i] != '\0'; i++) {
        printf("%s <=> %s de %s\n", a2bin_str(jeu[i]), getNomValeur(jeu[i]), getNomCouleur(jeu[i]));
    }
    printf("Nombre de cartes dans le jeu : %i\n",i);
}

void debug_print_mains(char** listeMains) {
    int i = 0;
    for (i = 0; listeMains[i] != NULL; i++) {
        printf("Main %i : %s de %s /"
                " %s de %s /"
                " %s de %s /"
                " %s de %s /"
                " %s de %s /"
                " %s de %s /"
                " %s de %s\n",
                i,
                getNomValeur(listeMains[i][0]),
                getNomCouleur(listeMains[i][0]),
                getNomValeur(listeMains[i][1]),
                getNomCouleur(listeMains[i][1]),
                getNomValeur(listeMains[i][2]),
                getNomCouleur(listeMains[i][2]),
                getNomValeur(listeMains[i][3]),
                getNomCouleur(listeMains[i][3]),
                getNomValeur(listeMains[i][4]),
                getNomCouleur(listeMains[i][4]),
                getNomValeur(listeMains[i][5]),
                getNomCouleur(listeMains[i][5]),
                getNomValeur(listeMains[i][6]),
                getNomCouleur(listeMains[i][6])
        );
    }
}


void debug_print_force(char* force) {
    assert(
        (force[0] == HAUTEUR) ||
        (force[0] == PAIRE) ||
        (force[0] == DOUBLE_PAIRE) ||
        (force[0] == BRELAN) ||
        (force[0] == QUINTE) ||
        (force[0] == COULEUR) ||
        (force[0] == FULL) ||
        (force[0] == CARRE) ||
        (force[0] == QUINTEFLUSH)
    );
    if (force[0] == QUINTEFLUSH) {
        printf("Quinteflush %s",getNomValeur(force[1]));
    }
    else if (force[0] == CARRE) {
        printf("Carre %s / %s",getNomValeur(force[1]),getNomValeur(force[2]));
    }
    else if (force[0] == FULL) {
        printf("Full %s %s",getNomValeur(force[1]),getNomValeur(force[2]));
    }
    else if (force[0] == COULEUR) {
        printf("Couleur %s %s %s %s %s",getNomValeur(force[1]),getNomValeur(force[2]),getNomValeur(force[3]),getNomValeur(force[4]),getNomValeur(force[5]));
    }
    else if (force[0] == QUINTE) {
        printf("Quinte au %s",getNomValeur(force[1]));
    }
    else if (force[0] == BRELAN) {
        printf("Brelan de %s / %s %s",getNomValeur(force[1]),getNomValeur(force[2]),getNomValeur(force[3]));
    }    
    else if (force[0] == DOUBLE_PAIRE) {
        printf("Double paire %s %s / %s",getNomValeur(force[1]),getNomValeur(force[2]),getNomValeur(force[3]));
    }
    else if (force[0] == PAIRE) {
        printf("Paire %s / %s %s %s",getNomValeur(force[1]),getNomValeur(force[2]),getNomValeur(force[3]),getNomValeur(force[4]));
    }
    else if (force[0] == HAUTEUR) {
        printf("Hauteur %s / %s %s %s %s",getNomValeur(force[1]),getNomValeur(force[2]),getNomValeur(force[3]),getNomValeur(force[4]),getNomValeur(force[5]));
    }
}

void print_bin(char a) {
   //Print la valeur binaire d'un char
   char* binary = a2bin_str(a);
   unsigned char i;
   for (i=0; binary[i]!='\0'; i++) {
      printf("%c",binary[i]);
   }
   printf("\n");
}

char* a2bin_str(char a) {
   //Gére les différentes tailles des chars
   char* binary = malloc(9 * sizeof(char));
   binary[8] = '\0';
   unsigned char i;
   //On remplit le tableau à l'envers pour rester cohérent
   for (i=0;i<=(sizeof(char)*8)-1;i++) {
       binary[(sizeof(char)*8)-1-i] = (a&(1<<i)) ? '1' : '0';
   }
   return binary;
}

char* getNomCouleur(char carte) {
    
    char couleur = getCouleur(carte);
    
    if (couleur == COEUR) { return "Coeur"; }
    if (couleur == CARREAU) { return "Carreau"; }
    if (couleur == TREFLE) { return "Trefle"; }
    if (couleur == PIQUE) { return "Pique"; }
    
    //Couleur non trouvée => Erreur
    printf("Failed trying to find color of this card : '%i'\n",carte);
    assert(0);
    return 0;
}


char* getNomValeur(char carte) {
    
    carte  = getValeur(carte);
    
    if (carte == DEUX) { return "Deux"; }
    if (carte == TROIS) { return "Trois"; }
    if (carte == QUATRE) { return "Quatre"; }
    if (carte == CINQ) { return "Cinq"; }
    if (carte == SIX) { return "Six"; }
    if (carte == SEPT) { return "Sept"; }
    if (carte == HUIT) { return "Huit"; }
    if (carte == NEUF) { return "Neuf"; }
    if (carte == DIX) { return "Dix"; }
    if (carte == VALET) { return "Valet"; }
    if (carte == DAME) { return "Dame"; }
    if (carte == ROI) { return "Roi"; }
    if (carte == AS) { return "As"; }
    
    printf("Failed trying to find value of this card : '%i'\n",carte);
    print_bin(carte);
    assert(0);
    return 0;
}
